Lista 3

Author

Leonardo Ramos Barbosa - 211010360

Published

November 16, 2023

Parte 1

Nesta parte você irá trabalhar com o banco ElephantsMF.csv. O banco contém variáveis das quais nos interessam:

  • Age: Idade (em anos)
  • Height: Altura dos ombros (em centímetros)
  • Sex: Sexo, (0 = female; 1 = male)

Comece carregando o pacote tidyverse conforme abaixo. Você pode utilizar o parâmetro message=FALSE se não quiser mostrar o carregamento do pacote na saída do arquivo final.

library(tidyverse)

Exercício 1

  1. Carregue o conjunto de dados ElephantsMF.csv, disponível nos arquivos da tarefa no MS Teams, em um novo objeto elephants.

R:

elephants <- read_csv("ElephantsMF.csv", show_col_types = FALSE)
New names:
• `` -> `...1`
elephants
# A tibble: 288 × 4
    ...1   Age Height Sex  
   <dbl> <dbl>  <dbl> <chr>
 1     1   1.4   120  M    
 2     2  17.5   227  M    
 3     3  12.8   235  M    
 4     4  11.2   210  M    
 5     5  12.7   220  M    
 6     6  12.7   189  M    
 7     7  12.2   225  M    
 8     8  12.2   204  M    
 9     9  28.2   266. M    
10    10  11.7   233  M    
# ℹ 278 more rows

Exercício 2

  1. Apresente as 10 primeiras e as 10 últimas linhas do banco de dados.

R:

head(elephants, 10)
# A tibble: 10 × 4
    ...1   Age Height Sex  
   <dbl> <dbl>  <dbl> <chr>
 1     1   1.4   120  M    
 2     2  17.5   227  M    
 3     3  12.8   235  M    
 4     4  11.2   210  M    
 5     5  12.7   220  M    
 6     6  12.7   189  M    
 7     7  12.2   225  M    
 8     8  12.2   204  M    
 9     9  28.2   266. M    
10    10  11.7   233  M    
tail(elephants, 10)
# A tibble: 10 × 4
    ...1   Age Height Sex  
   <dbl> <dbl>  <dbl> <chr>
 1   279 25.6    222. F    
 2   280  5.92   162. F    
 3   281  7.58   193. F    
 4   282 10      205. F    
 5   283 25.1    259. F    
 6   284  4.75   123. F    
 7   285 10.5    209. F    
 8   286 19.9    190. F    
 9   287 21.2    226. F    
10   288 13.2    221  F    

Exercício 3

  1. Faça um gráfico de dispersão da idade dos elefantes versus altura. Faça isso separando as cores por sexo. Além disso, as configurações básicas do R usam algumas cores espécificas quando não especificamos as cores que queremos. Sabendo disso, atribua para a variável Sex o tipo factor e mude as cores do gráfico para as de sua preferência. O que você pode concluir com esse gráfico?

R:

elephants$Sex <- as.factor(elephants$Sex)

ggplot(elephants) + geom_point(aes(x = Age, y = Height, color = Sex)) + 
  labs(title = "Scatter Plot of Elephants Age vs. Height") +
  scale_color_manual(values = c("M" = "black", "F" = "red")) 

Pelo gráfico percebe-se que os elefantes machos são mais altos e as fêmeas vivem mais.

Exercício 4

  1. Calcule a altura média e o desvio padrão dos elefantes para cada sexo. As medidas corroboram sua análise gráfica realizada no Exercício 3? Reflita e argumente sobre o porquê desse resultado.

R:

mean_male <- mean(elephants$Height[elephants$Sex == "M"], na.rm = T)
mean_male
[1] 185.1312
mean_female <- mean(elephants$Height[elephants$Sex == "F"], na.rm = T)
mean_female
[1] 190.0307
standard_deviation_male <- sd(elephants$Height[elephants$Sex == "M"], na.rm = T)
standard_deviation_male
[1] 55.61912
standard_deviation_female <- sd(elephants$Height[elephants$Sex == "F"], na.rm = T)
standard_deviation_female
[1] 45.56819

As médias de altura obtidas não corroboram com a análise de altura do item anterior. No entanto, essa disparidade pode ser atribuída à presença de mais elefantes fêmeas com idades mais avançadas, onde é provável que a altura atinja seu valor máximo. Observe que a média de idade dos elefantes nessa base de dados é 10.9713194 e apenas 45 machos tem idade superior a média, enquanto temos 78 fêmeas acima dessa idade. Além disso, vemos que o desvio padrão para as fêmeas é menor que para os machos, ou seja, a altura dos machos varia mais que a das fêmeas.

Exercício 5

  1. Faça um boxplot para cada categoria do sexo dos elefantes contra a altura, ordenando as “caixas” por mediana em ordem crescente. O que vê agora?

R:

ggplot(elephants, aes(x = reorder(Sex, Height), y = Height)) +
  labs(title = "Boxplot of Elephants Sex vs. Height") +
  geom_boxplot()

A mediana da altura dos machos é menor do que a mediana da altura das fêmeas, no entanto, a altura máxima dos machos é maior. Observa-se que os machos apresentam uma maior variabilidade, evidenciada pelo fato de que o primeiro quartil das fêmeas é consideravelmente mais alto do que o dos machos. Essa maior variabilidade nas alturas dos machos pode influenciar na explicação de por que a média das fêmeas é maior.

Parte 2

Agora você irá trabalhar com um banco de dados contendo indicadores de saúde relativos à diabetes. Para isso, é necessário conhecer as váriaveis que serão utilizadas:

  • Diabetes_012: Se o indivíduo possui ou não diabetes, (0 = no diabetes; 1 = prediabetes, 2 = diabetes)
  • BMI: Índice de Massa Corporal

Exercício 6

  1. Carregue o conjunto de dados diabetes_012_health_indicators_BRFSS2015.csv, disponível na tarefa do Microsoft Teams, em um novo objeto diabetes.

R:

diabetes <- read_csv("diabetes_012_health_indicators_BRFSS2015.csv", show_col_types = FALSE)
diabetes
# A tibble: 253,680 × 22
   Diabetes_012 HighBP HighChol CholCheck   BMI Smoker Stroke
          <dbl>  <dbl>    <dbl>     <dbl> <dbl>  <dbl>  <dbl>
 1            0      1        1         1    40      1      0
 2            0      0        0         0    25      1      0
 3            0      1        1         1    28      0      0
 4            0      1        0         1    27      0      0
 5            0      1        1         1    24      0      0
 6            0      1        1         1    25      1      0
 7            0      1        0         1    30      1      0
 8            0      1        1         1    25      1      0
 9            2      1        1         1    30      1      0
10            0      0        0         1    24      0      0
# ℹ 253,670 more rows
# ℹ 15 more variables: HeartDiseaseorAttack <dbl>, PhysActivity <dbl>,
#   Fruits <dbl>, Veggies <dbl>, HvyAlcoholConsump <dbl>, AnyHealthcare <dbl>,
#   NoDocbcCost <dbl>, GenHlth <dbl>, MentHlth <dbl>, PhysHlth <dbl>,
#   DiffWalk <dbl>, Sex <dbl>, Age <dbl>, Education <dbl>, Income <dbl>

Exercício 7

  1. Quais tipos de váriaveis temos no banco de dados?

R:

sapply(diabetes, class)
        Diabetes_012               HighBP             HighChol 
           "numeric"            "numeric"            "numeric" 
           CholCheck                  BMI               Smoker 
           "numeric"            "numeric"            "numeric" 
              Stroke HeartDiseaseorAttack         PhysActivity 
           "numeric"            "numeric"            "numeric" 
              Fruits              Veggies    HvyAlcoholConsump 
           "numeric"            "numeric"            "numeric" 
       AnyHealthcare          NoDocbcCost              GenHlth 
           "numeric"            "numeric"            "numeric" 
            MentHlth             PhysHlth             DiffWalk 
           "numeric"            "numeric"            "numeric" 
                 Sex                  Age            Education 
           "numeric"            "numeric"            "numeric" 
              Income 
           "numeric" 

Todas variáveis são do tipo numeric.

Exercício 8

  1. Atribua à variável Sex o tipo factor com níveis F e M. Você pode alterar os níveis da variável por meio do comando levels (consulte o help para mais detalhes). Depois, faça um gráfico de barras da variável Diabetes_012 segmentado por sexo. O que você observa?

R:

diabetes$Sex <- factor(diabetes$Sex,
                       levels = c(0, 1),
                       labels = c("F", "M"))

diabetes$Diabetes_012 <- factor(diabetes$Diabetes_012,
                                levels = c(0, 1, 2),
                                labels = c("No diabetes", "Prediabetes", "Diabetes"))

ggplot(diabetes, aes(x = Sex)) +
  geom_bar(aes(fill = Diabetes_012)) +
  labs(title = "Bar Chart of Diabetes Status Segmented by Sex") + 
  scale_y_continuous(labels = scales::number_format(scale = 1e-3, suffix = "k"))

A base de dados tem mais pessoas do sexo feminimo e podemos ver que há mais pessoas com pré-diabetes ou diabetes no sexo feminino.

Exercicio 9

  1. Refaça o gráfico do Exercício 8 com barras na mesma altura (por frequência relativa). O que você vê agora?

R:

ggplot(diabetes, aes(x = Sex)) +
  labs(title = "Bar Chart of Diabetes Status Segmented by Sex") +
  geom_bar(aes(fill = Diabetes_012), position = "fill") 

Com esse gráfico, observamos que a doença afeta uma maior porcentagem de pessoas do sexo masculino em comparação ao sexo feminino.

Exercicio 10

  1. Faça um histograma do índice de massa corporal (BMI) separado por sexo, em quadros diferentes. O que você vê?

R:

ggplot(diabetes, aes(x = BMI, fill = Sex)) +
  labs(title = "Histogram of BMI Segmented by Sex") +
  geom_histogram(binwidth = 2) +
  facet_wrap(~ Sex) 

Aparentemente mais pessoas do sexo feminino têm o BMI menor que 25. Além disso, podemos observar que ambos os sexos têm uma distribuição muito parecida em termos absolutos.

Exercício 11

  1. Faça um histograma (tipo densidade) do índice de massa corporal (BMI) separado por sexo, em quadros diferentes e com a linha da densidade junto ao histograma. Por quê as alturas relativas mudaram?

R:

ggplot(diabetes, aes(x = BMI, fill = Sex)) +
  labs(title = "Density Histogram of BMI Segmented by Sex") +
  geom_histogram(binwidth = 2, aes(y = after_stat(density))) +
  geom_density() + 
  facet_wrap(~ Sex) 

A distribuição das pessoas de sexo feminino é mais variada que as pessoas de sexo masculino, ou seja, o desvio padrão para as pessoas de sexo feminino é maior. As alturas relativas mudaram, porque a amostra de pessoas do sexo masculino tem uma variabilidade menor.

Parte 3

Nesta parte iremos refazer um gráfico muito legal criado no documentário Joy of Stats. Para isso precisamos de alguns pacotes adicionais. O pacote devtools facilita a vida de quem deseja desenvolver pacotes para o R e permite a instalação de pacotes diretamente dos seus repositórios (mesmo que sejam externos ao CRAN). O pacote gganimate permite a construção de animações a partir de gráficos gerados via ggplot2. O pacote gapminder contém os dados que o professor Hans Rosling utilizou em suas animações. O pacote gifski converte imagens em animações GIF, ideal para apresentarmos em arquivos html, e o pacote htmltools facilita a conversão de elementos gráficos do RMarkdown para html.

Essa é uma oportunidade para apresentar uma forma mais inteligente de instalarmos e carregarmos pacotes no RMarkdown. Vamos instalar o pacote gerenciador pacman. A linha abaixo verifica se o pacote está instalado no computador. Se não estiver, o R o instalará automaticamente.

if ( !require("pacman") ) install.packages( "pacman" )

Agora, o pacote pacman tentará, por meio do comando abaixo, carregar os pacotes citados acima. Se os pacotes já estiverem instalados, ele simplesmente os carregará. Caso contrário, ele os instalará e em seguida os carregará.

pacman::p_load( "devtools", "gganimate", "gapminder", "gifski", "htmltools" )

Um outro pacote que iremos necessitar é o ggflags que permite acessar as bandeiras dos países do nosso planeta. Esse pacote é um tanto mais chato de instalar. Precisamos acessá-lo diretamento do GitHub. Basta utilizar o comando abaixo, caso não possua o pacote instalado. Ele verifica se o pacote está instalado no computador. Caso contrário, instala automaticamente do GitHub. Em seguida carrega o pacote.

if ( !require("ggflags") ) devtools::install_github( 'rensa/ggflags', force = T )
library( ggflags )

Pronto, por meio do código abaixo, você poderá ver uma bela animação dos dados do gapminder. Tente compreender o código. É possível realizar muitas melhorias.

data( "gapminder" )
lybia <- filter( gapminder, country == "Libya" )
brasil <- filter( gapminder, country == "Brazil" )

g <- ggplot( gapminder, 
             aes(gdpPercap, lifeExp, size = pop, color=continent, frame = year)) +
  geom_point( alpha = 0.7 ) +
  scale_size( range = c(2, 12) ) +
  labs( title = 'Year: {frame_time}', 
        x = 'PIB per capita', 
        y = 'Expectativa de vida' ) +
  transition_time( year ) +
  geom_flag( data=brasil, country="br", show.legend=F ) +
  geom_flag( data=lybia, country="ly", show.legend=F )

animate( g, 
         height = 4, width = 6, units = "in",
         nframes=100, fps=10, res = 150,
         duration = 5, start_pause=5, end_pause=25 )

Exercício 12

  1. Ao invés de comparar o Brasil (br) à Líbia (ly) apenas, vamos compará-lo a um país de cada continente(Reino Unido (gb), China (cn), Africa do Sul (za) e Nova Zelândia(nz)). Além disso a animação está muito rápida e a escala original não favorece muito a nossa visualização, por isso aumente a duração da animação para 15 segundos e mude a escala dos eixos para log10. Pode demorar um pouco para renderizar.

R:

data( "gapminder" )
lybia <- filter( gapminder, country == "Libya" )
brasil <- filter( gapminder, country == "Brazil" )
uk <- filter( gapminder, country == "United Kingdom" )
china <- filter( gapminder, country == "China" )
south_africa <- filter( gapminder, country == "South Africa" )
new_zealand <- filter( gapminder, country == "New Zealand" )

g <- ggplot( gapminder, 
             aes(gdpPercap, lifeExp, size = pop, color = continent, frame = year)) +
  geom_point( alpha = 0.7 ) +
  scale_size_continuous(range = c(2, 12), name = "Population", 
                        labels = scales::number_format(scale = 1e-6, suffix = "M")) +
  scale_color_discrete(name = "Continent") +
  labs( title = 'Year: {frame_time}', 
        x = 'GDP per capita', 
        y = 'Life expectancy' ) +
  transition_time( year ) +
  geom_flag( data=brasil, country="br", show.legend=F ) +
  geom_flag( data=lybia, country="ly", show.legend=F ) +
  geom_flag( data=china, country="cn", show.legend=F ) +
  geom_flag( data=uk, country="gb", show.legend=F ) +
  geom_flag( data=new_zealand, country="nz", show.legend=F ) +
  geom_flag( data=south_africa, country="za", show.legend=F ) +
  scale_x_log10(labels = scales::number_format(scale = 1e-3, suffix = "k")) +
  scale_y_log10() 
    
animate( g, 
         height = 4, width = 6, units = "in",
         nframes=150, fps=10, res = 300,
         duration = 15, start_pause=5, end_pause=25 )